let arr = [{
  desc: "",
  id: "3",
  isEssential: "T",
  isPreset: true,
  level: 1,
  name: "header",
  scope: "3",
  type: "6",
  value: "",
}, {
  ancestorId: "3",
  desc: "",
  id: "4",
  isEssential: "T",
  isPreset: true,
  level: 2,
  name: "content-type",
  parentId: "3",
  scope: "1",
  type: "1",
  value: "application/json",
}, {
  desc: "",
  id: "5",
  isEssential: "T",
  isPreset: true,
  level: 1,
  name: "data",
  scope: "1",
  type: "6",
  value: "",
}];

const typeObj = {
  '6': {},//对象
  '1': '',//string
  '2': '',//数组
}

function toTree (arr) {
  let map = {};
  let res = {};
  // 转成id为key的map
  arr.map(e => {
    map[e.id] = e;
  });

  // 添加剩下的结构
  arr.forEach(e => {
    loop(res, map, e);
  });
  console.log('res', res);
  return res;
}

function loop (res, map, node) {
  // 终止条件
  console.log(node,'node');
  if (!node.parentId) {
    console.log("eeee");
    return getTypeValue(node.type, node);
  }
  // 从最后一层拼接到最上层
  return loop(res, map, getParent(res, node, map[node.parentId]));
}

function getTypeValue (type, item) {
  let res;
  switch (type) {
    case '6':
      // 对象
      res = {};
      if (item.value) {
        res = {
          [item.name]: item.value,
        }
      }
      break;
    case '1':
      // 字符串
      res = '';
      if (item.value) {
        res = item.value;
      }
      break;
    default:
      break;
  }

}

function getParent (res, node, parent) {
  // let p = map[node.parentId];
  console.log("p",parent);
  switch (parent.type) {
    case '6':
      // 对象
      return Object.assign(res[parent.name], { [node.name]: node.value });
    case '2':
      // 数组
      return res[map[node.parentId].name].concat(getTypeValue(node.type, node));
    default:
      break;
  }
}

console.log('res', toTree(arr));
// let obj = {
//   header:
//   {
//     'content-type': 'application/json'
//   },
//   data: ''
// }